home *** CD-ROM | disk | FTP | other *** search
/ Aminet 33 / Aminet 33 - October 1999.iso / Aminet / text / misc / UnDos.lha / undos / undos.c < prev    next >
Encoding:
C/C++ Source or Header  |  1989-02-27  |  3.5 KB  |  186 lines

  1. /*% cc -O -K % -o undos
  2.  *
  3.  * Undos - change DOS format files to Unix, etc.
  4.  */
  5. char ID[] =
  6.  "Undos Rev 12-07-85 (C)Copyright Omen Technology Inc All Rights Reserved\n";
  7. /*
  8.  * This program and documentation may be copied, used, or modified
  9.  *  by Professional-YAM and POWERCOMM licensees provided these notices are
  10.  * not removed.  Others may use this program for non-profit purposes only.
  11.  */
  12.  
  13. #include <stdio.h>
  14. #include <sys/types.h>
  15. #include <sys/stat.h>
  16.  
  17. #define LL 1024
  18. #define SUB 032
  19.  
  20. char Lbuf[LL];
  21. char *Progname;
  22. int Todos = 0;
  23. int Tocpm = 0;
  24. int Tomac = 0;
  25. int Unmac = 0;
  26. int Strip = 0;
  27.  
  28. main(argc, argv)
  29. char **argv;
  30. {
  31.     Progname = *argv;
  32.     if (! strcmp(Progname, "tocpm"))
  33.         Todos = Tocpm = 1;
  34.     if (! strcmp(Progname, "todos"))
  35.         Todos = 1;
  36.     if (! strcmp(Progname, "unmac"))
  37.         Unmac = 1;
  38.     if (! strcmp(Progname, "tomac"))
  39.         Tomac = 1;
  40.  
  41.     if (! strcmp(argv[1], "-s")) {
  42.         ++Strip; --argc; ++argv;
  43.     }
  44.  
  45.  
  46.     if (argc<2 || *argv[1]== '-')
  47.         usage();
  48.     while (--argc >= 1)
  49.         chngfmt(*++argv);
  50.     exit(0);
  51. }
  52. usage()
  53. {
  54.     fprintf(stderr, ID);
  55.     fprintf(stderr, "Usage: {undos|tounix|todos|tocpm|unmac} [-s] file ...\n");
  56.     fprintf(stderr, "    -s Strip parity bit, ignore bytes < 007\n");
  57.     exit(1);
  58. }
  59.  
  60.  
  61. chngfmt(name)
  62. char *name;
  63. {
  64.     register c;
  65.     register char *p;
  66.     register n;
  67.     register long fpos;
  68.     struct stat st;
  69.     FILE *fin, *fout;
  70.     int linno = 0;
  71.     long ftell();
  72.     char *mktemp();
  73.     char outnam[64];
  74.  
  75.     if (stat(name, &st)) {
  76.         xperror(name); return;
  77.     }
  78.     if ((st.st_mode & S_IFMT) != S_IFREG) {
  79.         fprintf(stderr, "%s: %s is not a regular file\n", Progname, name);
  80.         return;
  81.     }
  82.     if ((fin = fopen(name, "r")) == NULL) {
  83.         xperror(name); return;
  84.     }
  85.     strcpy(outnam, "undosXXXXXX");
  86.     mktemp(outnam);
  87.     if ((fout = fopen(outnam, "w")) == NULL) {
  88.         xperror(outnam); exit(1);
  89.     }
  90.  
  91.     for (;;) {
  92.         ++linno;
  93.         for (p=Lbuf, n=LL; --n>0; ) {
  94. ignore:
  95.             if ((c = getc(fin)) == EOF)
  96.                 break;
  97.             if ( !c)
  98.                 goto ignore;
  99.             if (c < '\7' || (c & 0200)) {
  100.                 if (Strip) {
  101.                     if ((c &= 0177) < 7)
  102.                         goto ignore;
  103.                 } else
  104.                     goto thisbin; 
  105.             }
  106.             if (c == SUB)
  107.                 break;
  108.             if (c == '\r' && Unmac)
  109.                 c = '\n';
  110.             *p++ = c;
  111.             if (c == '\n')
  112.                 break;
  113.         }
  114.         *p = '\0';
  115.  
  116.         if (n == 0) {
  117.     thisbin:
  118.             if (n) {
  119.                 fprintf(stderr, "%s: %s is a binary file", Progname, name);
  120.                 fprintf(stderr, " line=%d char =%2X\n", linno, c);
  121.             } else
  122.                 fprintf(stderr, "%s: %s has no linefeeds: try unmac?\n", Progname, name);
  123.             fclose(fout);
  124.             unlink(outnam);
  125.             return;
  126.         }
  127.  
  128.         if (Todos) {
  129.             if (*--p == '\n' && p[-1] != '\r') {
  130.                 *p++ = '\r'; *p++ = '\n'; *p = 0;
  131.             }
  132.         } else if (Tomac) {
  133.             if (*--p == '\n') {
  134.                 if (p[-1] == '\r')
  135.                     --p;
  136.                 *p++ = '\r'; *p = 0;
  137.             }
  138.         } else {
  139.             if (*--p == '\n' && *--p == '\r') {
  140.                 *p++ = '\n'; *p = 0;
  141.             }
  142.         }
  143.         if (fputs(Lbuf, fout) == EOF) {
  144.             xperror(outnam); exit(1);
  145.         }
  146.         switch (c) {
  147.         case EOF:
  148.             if (ferror(fin)) {
  149.                 xperror(name); exit(0200);
  150.             }
  151.         case SUB:
  152.             if (Tocpm) {
  153.                 fpos = ftell(fout);
  154.                 do {
  155.                     putc(SUB, fout);
  156.                 } while (++fpos & 127);
  157.             }
  158.             fclose(fout); fclose(fin);
  159.             if (st.st_nlink > 1) 
  160.                 sprintf(Lbuf, "cp %s %s", outnam, name);
  161.             else
  162.                 sprintf(Lbuf, "mv %s %s", outnam, name);
  163.             system(Lbuf);
  164.             utime(name, (struct utimbuf *) &st.st_atime);
  165.             if (st.st_nlink > 1) 
  166.                 unlink(outnam);
  167.             return;
  168.         }
  169.     }
  170. }
  171.  
  172. xperror(s)
  173. char *s;
  174. {
  175.     register char *p;
  176.     extern int sys_nerr;
  177.     extern char *sys_errlist[];
  178.     extern errno;
  179.  
  180.     if (errno >= sys_nerr)
  181.         p = "Gloryovsky: a New Error!";
  182.     else
  183.         p = sys_errlist[errno];
  184.     fprintf(stderr, "%s: %s: %s\n", Progname, s, p);
  185. }
  186.